home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Magazine / Online / OpenURL / Developer / Source / prefs_browsereditwin.c < prev    next >
C/C++ Source or Header  |  1999-09-26  |  9KB  |  303 lines

  1. /*
  2. ** OpenURL - MUI preferences for openurl.library
  3. ** Written by Troels Walsted Hansen <troels@thule.no>
  4. ** Placed in the public domain.
  5. **
  6. ** This module contains the code to the BrowserEditWin Window.mui subclass.
  7. */
  8.  
  9. #include "prefs_common.h"
  10. #include "prefs_main.h"
  11. #include "prefs_app.h"
  12. #include "prefs_browsereditwin.h"
  13.  
  14. /**************************************************************************/
  15.  
  16. static ULONG mNew           (struct IClass *cl, Object *obj, struct opSet *msg);
  17. static ULONG mGet           (struct IClass *cl, Object *obj, struct opGet *msg);
  18. static ULONG mWindow_Setup  (struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg);
  19. static ULONG mOk            (struct IClass *cl, Object *obj, struct MUIP_BrowserEditWin_Ok *msg);
  20.  
  21. static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
  22.                                   REG(a2) Object *obj, 
  23.                                   REG(a1) Object *string);
  24.  
  25. /**************************************************************************/
  26.  
  27. static const char *Browser_PlaceHolders[] =
  28. {
  29.     "%u|URL",
  30.     NULL,
  31. };
  32.  
  33. /**************************************************************************/
  34.  
  35. static ULONG mNew(struct IClass *cl, Object *obj, struct opSet *msg)
  36. {
  37.     Object *browserl, *infog, *names, *pathp, *ports, *portp, 
  38.            *cmdg, *shows, *tofronts, *openurlp, *openurlwp, *okb, *cancelb;
  39.  
  40.     struct URL_BrowserNode *bn = (struct URL_BrowserNode *)GetTagData(MUIA_BrowserEditWin_Browser, NULL, msg->ops_AttrList);
  41.     browserl = (Object *)GetTagData(MUIA_BrowserEditWin_ListObj, NULL, msg->ops_AttrList);
  42.  
  43.     if(!bn || !browserl) return(0);
  44.  
  45.     obj = (Object *)DoSuperNew(cl, obj,
  46.         MUIA_Window_ID,          MAKE_ID('E', 'D', 'B', 'R'),
  47.         MUIA_Window_Title,       APPNAME " · Edit Browser",
  48.         WindowContents, VGroup,
  49.             Child, infog = ColGroup(2),
  50.                 GroupFrameT("Browser information"),
  51.  
  52.                 Child, KeyLabel2("Name", 'n'),
  53.                 Child, names = StringObject, 
  54.                     StringFrame,
  55.                     MUIA_CycleChain,         TRUE,
  56.                     MUIA_ControlChar,        'n',
  57.                     MUIA_String_MaxLen,      UBN_NAME_LEN,
  58.                     MUIA_String_Contents,    bn->ubn_Name,
  59.                     MUIA_String_AdvanceOnCR, TRUE,
  60.                 End,
  61.  
  62.                 Child, KeyLabel2("Path", 'p'),
  63.                 Child, pathp = PopplaceholderObject, 
  64.                     MUIA_Popph_Array,        Browser_PlaceHolders,
  65.                     MUIA_Popph_StringKey,    'p',
  66.                     MUIA_Popph_StringMaxLen, UBN_PATH_LEN,
  67.                     MUIA_Popph_Contents,     bn->ubn_Path,
  68.                     MUIA_Popph_PopAsl,       TRUE,
  69.                     MUIA_Popasl_Type,        ASL_FileRequest,
  70.                     MUIA_String_AdvanceOnCR, TRUE,
  71.                 End,
  72.  
  73.                 Child, KeyLabel2("ARexx port", 'a'),
  74.                 Child, portp = PopportObject, 
  75.                     MUIA_Popstring_String, ports = StringObject, 
  76.                         StringFrame,
  77.                         MUIA_CycleChain,         TRUE,
  78.                         MUIA_ControlChar,        'a',
  79.                         MUIA_String_MaxLen,      UBN_PORT_LEN,
  80.                         MUIA_String_Contents,    bn->ubn_Port,
  81.                         MUIA_String_AdvanceOnCR, TRUE,
  82.                     End,
  83.                     MUIA_Popstring_Button,  myPopButton(MUII_PopUp),
  84.                     MUIA_Popport_ARexxOnly, TRUE,
  85.                 End,
  86.             End,
  87.  
  88.             Child, cmdg = ColGroup(2),
  89.                 GroupFrameT("ARexx commands"),
  90.  
  91.                 Child, KeyLabel2("Show/Uniconify", 's'),
  92.                 Child, shows = StringObject, 
  93.                     StringFrame,
  94.                     MUIA_CycleChain,         TRUE,
  95.                     MUIA_ControlChar,        's',
  96.                     MUIA_String_MaxLen,      UBN_SHOWCMD_LEN,
  97.                     MUIA_String_Contents,    bn->ubn_ShowCmd,
  98.                     MUIA_String_AdvanceOnCR, TRUE,
  99.                 End,
  100.  
  101.                 Child, KeyLabel2("Screen to front", 'f'),
  102.                 Child, tofronts = StringObject, 
  103.                     StringFrame,
  104.                     MUIA_CycleChain,         TRUE,
  105.                     MUIA_ControlChar,        'f',
  106.                     MUIA_String_MaxLen,      UBN_TOFRONTCMD_LEN,
  107.                     MUIA_String_Contents,    bn->ubn_ToFrontCmd,
  108.                     MUIA_String_AdvanceOnCR, TRUE,
  109.                 End,
  110.  
  111.                 Child, KeyLabel2("Open URL...", 'u'),
  112.                 Child, openurlp = PopplaceholderObject,
  113.                     MUIA_Popph_Array,        Browser_PlaceHolders,
  114.                     MUIA_Popph_StringKey,    'u',
  115.                     MUIA_Popph_StringMaxLen, UBN_OPENURLCMD_LEN,
  116.                     MUIA_Popph_Contents,     bn->ubn_OpenURLCmd,
  117.                     MUIA_String_AdvanceOnCR, TRUE,
  118.                 End,
  119.  
  120.                 Child, KeyLabel2("...in new window", 'w'),
  121.                 Child, openurlwp = PopplaceholderObject,
  122.                     MUIA_Popph_Array,       Browser_PlaceHolders,
  123.                     MUIA_Popph_StringKey,   'w',
  124.                     MUIA_Popph_StringMaxLen, UBN_OPENURLWCMD_LEN,
  125.                     MUIA_Popph_Contents,     bn->ubn_OpenURLWCmd,
  126.                     MUIA_String_AdvanceOnCR, TRUE,
  127.                 End,
  128.             End,
  129.  
  130.             Child, ColGroup(3),
  131.                 Child, okb   = SimpleButton("_Ok"),
  132.                 Child, RectangleObject, End,
  133.                 Child, cancelb = SimpleButton("_Cancel"),
  134.             End,
  135.         End,
  136.         TAG_MORE, msg->ops_AttrList);
  137.  
  138.     if(obj)
  139.     {
  140.         struct BrowserEditWin_Data *data = INST_DATA(cl, obj);
  141.         memset(data, '\0', sizeof(struct BrowserEditWin_Data));
  142.  
  143.         /* init instance data */
  144.  
  145.         data->Browser        = bn;
  146.         data->BrowserLstObj  = browserl;
  147.  
  148.         data->InfoGrpObj     = infog;
  149.         data->NameStrObj     = names;
  150.         data->PathPopObj     = pathp;
  151.         data->PortStrObj     = ports;
  152.  
  153.         data->CmdGrpObj      = cmdg;
  154.         data->ShowStrObj     = shows;
  155.         data->ToFrontStrObj  = tofronts;
  156.         data->OpenURLPopObj  = openurlp;
  157.         data->OpenURLWPopObj = openurlwp;
  158.  
  159.         data->OkButObj       = okb;
  160.         data->CancelButObj   = cancelb;
  161.  
  162.         /* buttons */
  163.  
  164.         DoMethod(obj, MUIM_MultiSet, MUIA_CycleChain, TRUE, okb, cancelb, NULL);
  165.  
  166.         /* add hook */
  167.  
  168.         data->ObjStrHook.h_Entry = (HOOKFUNC)ObjStrFunc;
  169.         data->ObjStrHook.h_Data = (APTR)xget(portp, MUIA_Popobject_ObjStrHook);
  170.         set(portp, MUIA_Popobject_ObjStrHook, &data->ObjStrHook);
  171.     }
  172.  
  173.     return((ULONG)obj);
  174. }
  175.  
  176. /**************************************************************************/
  177.  
  178. static ULONG mGet(struct IClass *cl, Object *obj, struct opGet *msg)
  179. {
  180.     struct BrowserEditWin_Data *data = INST_DATA(cl,obj);
  181.  
  182.     switch(msg->opg_AttrID)
  183.     {
  184.         case MUIA_BrowserEditWin_Browser:
  185.             *(msg->opg_Storage) = (ULONG)data->Browser;
  186.             return(TRUE);
  187.     }
  188.  
  189.     return(DoSuperMethodA(cl, obj, (Msg)msg));
  190. }
  191.  
  192. /**************************************************************************/
  193.  
  194. static ULONG mWindow_Setup(struct IClass *cl, Object *obj, struct MUIP_Window_Setup *msg)
  195. {
  196.     struct BrowserEditWin_Data *data = INST_DATA(cl,obj);
  197.  
  198.     if (!DoSuperMethodA(cl,obj,(Msg)msg))
  199.         return(FALSE);
  200.  
  201.     if(!data->NotifiesAdded)
  202.     {
  203.         /* buttons */
  204.         DoMethod(data->OkButObj,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_BrowserEditWin_Ok);
  205.         DoMethod(data->CancelButObj, MUIM_Notify, MUIA_Pressed, FALSE, obj, 3, MUIM_Set, MUIA_Window_CloseRequest, TRUE);
  206.  
  207.         /* window notifies */
  208.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, _app(obj), 6, MUIM_Application_PushMethod, _app(obj), 3, MUIM_App_CloseWin, MUIA_BrowserEditWin_Browser, data->Browser);
  209.  
  210.         data->NotifiesAdded = TRUE;
  211.     }
  212.  
  213.     return(TRUE);
  214. }
  215.  
  216. /**************************************************************************/
  217.  
  218. static ULONG mOk(struct IClass *cl, Object *obj, struct MUIP_BrowserEditWin_Ok *msg)
  219. {
  220.     struct BrowserEditWin_Data *data = INST_DATA(cl,obj);
  221.     struct URL_BrowserNode *bn = data->Browser;
  222.     LONG visible, first, i;
  223.  
  224.     /* update the structure */
  225.  
  226.     strcpy(bn->ubn_Name, (char *)xget(data->NameStrObj, MUIA_String_Contents));
  227.     strcpy(bn->ubn_Path, (char *)xget(data->PathPopObj, MUIA_Popph_Contents));
  228.     strcpy(bn->ubn_Port, (char *)xget(data->PortStrObj, MUIA_String_Contents));
  229.  
  230.     strcpy(bn->ubn_ShowCmd,     (char *)xget(data->ShowStrObj,     MUIA_String_Contents));
  231.     strcpy(bn->ubn_ToFrontCmd,  (char *)xget(data->ToFrontStrObj,  MUIA_String_Contents));
  232.     strcpy(bn->ubn_OpenURLCmd,  (char *)xget(data->OpenURLPopObj,  MUIA_Popph_Contents));
  233.     strcpy(bn->ubn_OpenURLWCmd, (char *)xget(data->OpenURLWPopObj, MUIA_Popph_Contents));
  234.  
  235.     /* update the listview */
  236.  
  237.     get(data->BrowserLstObj, MUIA_List_Visible, &visible);
  238.     if(visible != -1)
  239.     {
  240.         get(data->BrowserLstObj, MUIA_List_First, &first);
  241.  
  242.         for(i = first; i < (first + visible); i++)
  243.         {
  244.             DoMethod(data->BrowserLstObj, MUIM_List_GetEntry, i, &bn);
  245.             if(!bn) break;
  246.  
  247.             if(bn == data->Browser)
  248.             {
  249.                 DoMethod(data->BrowserLstObj, MUIM_List_Redraw, i);
  250.                 break;
  251.             }
  252.         }
  253.     }
  254.  
  255.     /* close edit site window */
  256.  
  257.     set(obj, MUIA_Window_CloseRequest, TRUE);
  258.  
  259.     return(TRUE);
  260. }
  261.  
  262. /**************************************************************************/
  263.  
  264. SAVEDS ASM ULONG BrowserEditWin_Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  265. {
  266.     switch(msg->MethodID)
  267.     {
  268.         case OM_NEW           : return(mNew         (cl,obj,(APTR)msg));
  269.         case OM_GET           : return(mGet         (cl,obj,(APTR)msg));
  270.         case MUIM_Window_Setup: return(mWindow_Setup(cl,obj,(APTR)msg));
  271.         case MUIM_BrowserEditWin_Ok  : return(mOk          (cl,obj,(APTR)msg));
  272.     }
  273.  
  274.     return(DoSuperMethodA(cl,obj,msg));
  275. }
  276.  
  277. /**************************************************************************/
  278.  
  279. static SAVEDS ASM VOID ObjStrFunc(REG(a0) struct Hook *hook, 
  280.                                   REG(a2) Object *obj, 
  281.                                   REG(a1) Object *string)
  282. {
  283.     STRPTR port, dot, digit;
  284.     char buf[UBN_PORT_LEN];
  285.  
  286.     if(hook->h_Data) CallHookPkt(hook->h_Data, obj, string);
  287.  
  288.     get(string, MUIA_String_Contents, &port);
  289.     dot = strrchr(port, '.');
  290.  
  291.     if(dot)
  292.     {
  293.         dot++;
  294.  
  295.         for(digit = dot; *digit; digit++)
  296.             if(!isdigit(*digit))
  297.                 return;
  298.  
  299.         stccpy(buf, port, dot - port);
  300.         set(string, MUIA_String_Contents, buf);
  301.     }
  302. }
  303.